import { useUserStore } from '../stores/user'
import { baseConfig } from '../config/env'

// 基础配置直接使用导入的配置
const config = baseConfig

// 请求拦截器
const httpInterceptor = {
  invoke(options) {
    console.log('请求配置:', options)
    console.log('基础URL:', config.baseURL)

    // 1. 拼接完整请求地址
    if (!options.url.startsWith('http')) {
      options.url = config.baseURL + options.url
      console.log('完整请求URL:', options.url)
    }

    // 2. 请求超时
    options.timeout = options.timeout || config.timeout

    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      'source-client': 'miniapp'
    }

    // 4. 添加 token 请求头标识
    const userStore = useUserStore()
    const token = userStore.getToken()
    if (token) {
      options.header.Authorization = token
    }

    // 5. 处理图片上传接口 URL
    if (options.usePictureURL === true) {
      options.url = options.url.replace(config.baseURL, import.meta.env.VITE_APP_API_PICTURE_URL)
      delete options.usePictureURL
    }

    return options
  }
}

// 响应拦截器
const httpResponse = {
  async success(response) {
    const { statusCode, data: res } = response

    // 请求成功
    if (statusCode === 200 && res.code === 200) {
      return res
    }

    // 401 未授权
    if (res.code === 401) {
      const userStore = useUserStore()
      userStore.clearLogin()
      uni.showToast({
        title: res.data || '登录已过期，请重新登录',
        icon: 'none'
      })
      // 跳转登录页
      uni.navigateTo({
        url: '/pages/login/index'
      })
      return Promise.reject(new Error(res.data || '登录已过期，请重新登录'))
    }

    // 其他错误
    uni.showToast({
      title: res.message || '操作失败',
      icon: 'none'
    })
    return Promise.reject(new Error(res.message || '操作失败'))
  },
  fail(error) {
    uni.showToast({
      title: error.errMsg || '网络错误',
      icon: 'none'
    })
    return Promise.reject(error)
  }
}

// 注册拦截器
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)

// 封装请求方法
export const http = {
  request(options) {
    return new Promise((resolve, reject) => {
      uni.request({
        ...options,
        success: (res) => {
          httpResponse.success(res).then(resolve).catch(reject)
        },
        fail: (err) => {
          httpResponse.fail(err)
          reject(err)
        }
      })
    })
  },

  // GET请求
  get(url, data = {}, options = {}) {
    return this.request({
      url,
      data,
      method: 'GET',
      ...options
    })
  },

  // POST请求
  post(url, data = {}, options = {}) {
    return this.request({
      url,
      data,
      method: 'POST',
      ...options
    })
  }
}

export default http
